package com.example.project.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Redmine 风格的时间格式转换工具类 支持多种时间格式输入，转换为小时数（double）
 */
public class TimeConverter {

	/**
	 * 将时间字符串转换为小时数
	 * 
	 * @param timeStr 时间字符串，支持格式： - "2.5"、 "2,5" → 2.5小时 - "2:30" → 2.5小时 - "2h30m"
	 *                → 2.5小时 - "2h" → 2小时 - "30m" → 0.5小时 - "2.5h" → 2.5小时
	 * @return 转换后的小时数，如果转换失败返回 null
	 */
	public static Double toHours(String timeStr) {
		if (timeStr == null || timeStr.trim().isEmpty()) {
			return null;
		}

		String s = timeStr.trim();

		// 格式1：数字[.数字]h? 例如：2.5, 2.5h, 2,5h
		Pattern numberPattern = Pattern.compile("^(\\d+[.,]\\d+?)h?$");
		Matcher numberMatcher = numberPattern.matcher(s);
		if (numberMatcher.matches()) {
			String numberStr = numberMatcher.group(1).replace(',', '.');
			try {
				return Double.parseDouble(numberStr);
			} catch (NumberFormatException e) {
				return null;
			}
		}

		// 格式2：小时:分钟 例如：2:30 → 2.5
		Pattern timePattern = Pattern.compile("^(\\d+):(\\d+)$");
		Matcher timeMatcher = timePattern.matcher(s);
		if (timeMatcher.matches()) {
			try {
				int hours = Integer.parseInt(timeMatcher.group(1));
				int minutes = Integer.parseInt(timeMatcher.group(2));
				return hours + minutes / 60.0;
			} catch (NumberFormatException e) {
				return null;
			}
		}

		// 格式3：小时 + 分钟组合 例如：2h30m, 2h, 30m
		Pattern combinedPattern = Pattern.compile("^((\\d+)\\s*(h|hours?))?\\s*((\\d+)\\s*(m|min))?$",
				Pattern.CASE_INSENSITIVE);
		Matcher combinedMatcher = combinedPattern.matcher(s);
		if (combinedMatcher.matches()) {
			String hourPart = combinedMatcher.group(1);
			String minutePart = combinedMatcher.group(4);

			double totalHours = 0.0;

			if (hourPart != null && !hourPart.isEmpty()) {
				try {
					totalHours += Integer.parseInt(combinedMatcher.group(2));
				} catch (NumberFormatException e) {
					return null;
				}
			}

			if (minutePart != null && !minutePart.isEmpty()) {
				try {
					int minutes = Integer.parseInt(combinedMatcher.group(5));
					totalHours += minutes / 60.0;
				} catch (NumberFormatException e) {
					return null;
				}
			}

			return totalHours > 0 ? totalHours : null;
		}

		return null;
	}

	/**
	 * 计算剩余预期时间 公式：预期时间 * (100 - 完成百分比) / 100
	 * 
	 * @param estimatedHours 预期时间（小时）
	 * @param doneRatio      完成百分比（0-100）
	 * @return 剩余预期时间
	 */
	public static Double calculateRemainingHours(Double estimatedHours, Integer doneRatio) {
		if (estimatedHours == null || estimatedHours <= 0) {
			return 0.0;
		}

		int ratio = (doneRatio != null && doneRatio >= 0 && doneRatio <= 100) ? doneRatio : 0;
		return estimatedHours * (100 - ratio) / 100.0;
	}

	/**
	 * 验证时间值是否有效
	 * 
	 * @param hours 小时数
	 * @return 如果 >= 0 返回 true，否则返回 false
	 */
	public static boolean isValidHours(Double hours) {
		return hours != null && hours >= 0;
	}

	// 测试方法
	public static void main(String[] args) {
		String[] testCases = { "2.5", "2,5", "2.5h", "2,5h", "2:30", "1:45", "2h30m", "2h", "30m", "45m", "1h30m",
				"3hours", "2min", "invalid", "", null };

		System.out.println("时间格式转换测试:");
		for (String testCase : testCases) {
			Double result = toHours(testCase);
			System.out.printf("'%s' → %.2f 小时%n", testCase, result != null ? result : 0.0);
		}

		System.out.println("\n剩余时间计算测试:");
		System.out.printf("预期: 100小时, 完成: 30%% → 剩余: %.1f小时%n", calculateRemainingHours(100.0, 30));
		System.out.printf("预期: 40小时, 完成: 75%% → 剩余: %.1f小时%n", calculateRemainingHours(40.0, 75));
	}
}